package com.mingzhi.lotterysystem.common.utils;

import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
import com.aliyun.tea.TeaException;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class SMSUtil {
    private static final Logger logger = LoggerFactory.getLogger(SMSUtil.class);

    /**
     * signName 签名
     *
     * @Value 将配置文件中的值注入进来
     */
    @Value(value = "${sms.sign-name}")
    private String signName;

    /**
     * 访问 密钥Id
     */
    @Value(value = "${sms.access-key-id}")
    private String accessKeyId;

    /**
     * 访问密钥
     */
    @Value(value = "${sms.access-key-secret}")
    private String accessKeySecret;

    /**
     * 发送短信
     *
     * @param templateCode  模版号
     * @param phoneNumbers  手机号
     * @param templateParam 模板里面的参数
     */
    public void sendMessage(String templateCode, String phoneNumbers, String templateParam) {
        try {
            Client client = createClient();
            //发送短信请求  进行赋值
            SendSmsRequest sendSmsRequest = new SendSmsRequest()
                    .setSignName(signName)
                    .setPhoneNumbers(phoneNumbers)
                    .setTemplateCode(templateCode)
                    .setTemplateParam(templateParam);
            //RuntimeOptions 是一个常见的类名，用于封装运行时的配置选项或参数。
            //这类对象通常用来设置在运行时需要的各种配置项，比如超时设置、重试次数、日志级别等。
            //这些配置项可以被传递给其他类或者方法，以定制化其行为。
            RuntimeOptions runtimeOptions = new RuntimeOptions();
            //它的作用是发送短信，同时允许你传入一些额外的运行时配置选项（如超时、重试次数等）。
            SendSmsResponse response = client.sendSmsWithOptions(sendSmsRequest, runtimeOptions);
            if (null != response.getBody()
                    && null != response.getBody().getMessage()
                    && "OK".equals(response.getBody().getMessage())) {
                logger.info("向{}发送信息成功，templateCode={}", phoneNumbers, templateCode);
                return;
            }
            logger.warn("向{}发送信息失败，templateCode={}，失败原因：{}", phoneNumbers, templateCode, response.getBody().getMessage());
        } catch (TeaException error) {
            logger.warn("向{}发送信息失败，templateCode={}", phoneNumbers, templateCode, error);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(),_error);
            logger.warn("向{}发送信息失败，templateCode={}", phoneNumbers, templateCode, _error);
        }
    }

    /**
     * 使用 AK 和 SK 初始化账号 Client
     *
     * @return Client
     */
    private Client createClient() throws Exception {
        // ⼯程代码泄露可能会导致 AccessKey 泄露，并威胁账号下所有资源的安全性。以下代码⽰例仅供参考。
        // 建议使⽤更安全的 STS ⽅式，更多鉴权访问⽅式请参⻅：
        //https://help.aliyun.com/document_detail/378657.html
        Config config = new Config()
                .setAccessKeyId(accessKeyId)
                .setAccessKeySecret(accessKeySecret);
        // Endpoint 请参考 https://api.aliyun.com/product/Dysmsapi
        config.endpoint = "dysmsapi.aliyuncs.com";
        return new Client(config);
    }
}
